// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/test/views_test_helper_aura.h"

#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/test/aura_test_helper.h"
#include "ui/wm/core/capture_controller.h"
#include "ui/wm/core/default_activation_client.h"
#include "ui/wm/core/default_screen_position_client.h"
#include "ui/wm/core/wm_state.h"

namespace views {

// static
ViewsTestHelper* ViewsTestHelper::Create(base::MessageLoopForUI* message_loop,
    ui::ContextFactory* context_factory)
{
    return new ViewsTestHelperAura(message_loop, context_factory);
}

ViewsTestHelperAura::ViewsTestHelperAura(base::MessageLoopForUI* message_loop,
    ui::ContextFactory* context_factory)
    : context_factory_(context_factory)
{
    aura_test_helper_.reset(new aura::test::AuraTestHelper(message_loop));
}

ViewsTestHelperAura::~ViewsTestHelperAura()
{
}

void ViewsTestHelperAura::SetUp()
{
    aura_test_helper_->SetUp(context_factory_);
    gfx::NativeWindow root_window = GetContext();
    new wm::DefaultActivationClient(root_window);
    wm_state_.reset(new wm::WMState);

    if (!aura::client::GetScreenPositionClient(root_window)) {
        screen_position_client_.reset(new wm::DefaultScreenPositionClient);
        aura::client::SetScreenPositionClient(root_window,
            screen_position_client_.get());
    }
}

void ViewsTestHelperAura::TearDown()
{
    // Ensure all Widgets (and windows) are closed in unit tests. This is done
    // automatically when the RootWindow is torn down, but is an error on
    // platforms that must ensure no Compositors are alive when the ContextFactory
    // is torn down.
    // So, although it's optional, check the root window to detect failures before
    // they hit the CQ on other platforms.
    DCHECK(aura_test_helper_->root_window()->children().empty())
        << "Not all windows were closed.";

    if (screen_position_client_.get() == aura::client::GetScreenPositionClient(GetContext()))
        aura::client::SetScreenPositionClient(GetContext(), nullptr);

    aura_test_helper_->TearDown();
    wm_state_.reset();
    CHECK(!wm::ScopedCaptureClient::IsActive());
}

gfx::NativeWindow ViewsTestHelperAura::GetContext()
{
    return aura_test_helper_->root_window();
}

} // namespace views
